rtos load压缩rtos
一 概述
当rtos编译出来的镜像大小觉得过于庞大, 可以通过压缩将rtos镜像变小, 需要另外编译一个rtos镜像用于load解压这个被压缩的rtos镜像.
二 load压缩rtos的rtos制作
2.1 软件配置
以x1600en_nand_defconfig 为例

这个rtos只是为了load解压压缩的rtos, 固件加载地址放在ddr后面,解压压缩的rtos后,内存就可以给解压后的rtos使用

勾选lzma相关

修改完成配置后保存.
2.2 软件修改
在/rtos工程目录/freertos/vendor/vendor.c内, 修改代码如下:
#include <stdio.h>
#include "../example/driver/load_rtos_split_example.c"
void vendor_init(void *arg)
{
printf("vendor init...\n");
load_rtos_split();
}
编译rtos系统:
bhu@bhu-PC:~/rtos/freertos$ make x1600en_nand_defconfig
bhu@bhu-PC:~/rtos/freertos$ make
bhu@bhu-PC:~/rtos/freertos$ ls -l rtos-with-spl.bin
-rw-r--r-- 1 bhu bhu 408392 8月 19 16:42 rtos-with-spl.bin //生成文件
三 压缩rtos制作
3.1 软件配置
以x1600en_nand_defconfig为例

勾选压缩rtos,使用lzma(与二章节中的解压方式对应), 压缩的rtos固件加载可以使用到ddr所有大小


分包的目的是一边读取数据一边解码,加速启动
分包最大值是最多可以多少个包,需要和代 码里面的值一致(一般不修改), 位于工程freertos/example/driver/load_rtos_split_example.c

包大小可以根据镜像大小调整
修改完成配置后保存, 编译rtos系统
bhu@bhu-PC:~/rtos/freertos$ make x1600en_nand_defconfig
bhu@bhu-PC:~/rtos/freertos$ make
bhu@bhu-PC:~/rtos/freertos$ ls -l zero_split.lzma
-rw-r--r-- 1 bhu bhu 133852 8月 19 16:42 zero_split.lzma //生成文件
四 烧录

分区划分:
boot : load rtos并解压,即二章节编译出来的镜像
rtos1 :选择压缩rtos镜像, 即三章节编译的镜像, 若不配置ota分区, 默认从rtos1启动, 若配置了ota分区, 可以选择rto1或rtos2启动
rtos2:选择压缩rtos镜像, 可通过写入ota分区信息, 切换分区启动, 不需要切换分区, 可以不配置
ota:通过ota分区内容判断从rtos1分区启动还是rtos2, 默认从rtos1分区启动, 烧录内容可为空, 不需要切换分区, 可以不配置
分区可修改, 代码位于工程freertos/example/driver/load_rtos_split_example.c



五 验证
U-Boot SPL 2013.07-00023-ge59480c41e-dirty (Dec 31 2025 - 10:29:40)
ERROR EPC 83fac8e4
CPA_CPAPCR:02e049cd
CPM_CPMPCR:0af0c9cd
CPM_CPEPCR:019051cd
CPM_CPCCR:9a094410
SOC: X1600EN
DDR: X1600EN-DDR2 type is : DDR2
ddr_inno_phy_init ..! 11: 00000006
mr0 = 0x00b73011
mr1 = 0x00004111
DDRP_INNOPHY_CALIB_DELAY_AL:00000051
DDRP_INNOPHY_CALIB_DELAY_AH:00000051
-----ddr_readl(DDRP_INNOPHY_CALIB_DONE): 00000003
ddr calib finish
457, VID=0x000000c8, PID=0x00000091
rtos not found: rtos
use rtos default offset_addr:26624
[0.000000] xburst rtos @ Aug 20 2026 09:15:22, epc: 83fac8e4
[0.000105] pwm clk rate 300000000
[0.000385] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064593] vendor init...
[0.138999] now uncompress : rtos1 //默认从rtos1分区启动,解压rtos1
[0.172532] ready jump to: rtos1
[0.000000] xburst rtos @ Aug 20 2026 09:16:48, epc: 83fac8e4
[0.000101] pwm clk rate 300000000
[0.000382] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064558] vendor init...
往ota分区写入信息ota:rtos2
$ nand_write 0x300000 0x6f 0x74 0x61 0x3a 0x72 0x74 0x6f 0x73 0x32
0x300000 #ota分区offset
6f 74 61 3a 72 74 6f 73 32 0a |ota:rtos2.|
U-Boot SPL 2013.07-00023-ge59480c41e-dirty (Dec 31 2025 - 10:29:40)
ERROR EPC 800274e8
CPA_CPAPCR:02e049cd
CPM_CPMPCR:0af0c9cd
CPM_CPEPCR:019051cd
CPM_CPCCR:9a094410
SOC: X1600EN
DDR: X1600EN-DDR2 type is : DDR2
ddr_inno_phy_init ..! 11: 00000006
mr0 = 0x00b73011
mr1 = 0x00004111
DDRP_INNOPHY_CALIB_DELAY_AL:00000051
DDRP_INNOPHY_CALIB_DELAY_AH:00000051
-----ddr_readl(DDRP_INNOPHY_CALIB_DONE): 00000003
ddr calib finish
457, VID=0x000000c8, PID=0x00000091
rtos not found: rtos
use rtos default offset_addr:26624
[0.000000] xburst rtos @ Aug 20 2026 09:15:22, epc: 800274e8
[0.000106] pwm clk rate 300000000
[0.000385] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064592] vendor init...
[0.138997] now uncompress : rtos2 //切换到rtos2分区,解压rtos2
[0.172533] ready jump to: rtos2
[0.000000] xburst rtos @ Aug 20 2026 09:16:48, epc: 800274e8
[0.000101] pwm clk rate 300000000
[0.000381] Supported Nand Flash, GD5F1GM7UE(c8:91)
[0.064557] vendor init...